package br.ufg.inf.tag;

import br.ufg.inf.comum.Conexao;
import br.ufg.inf.comum.DAO;
import br.ufg.inf.musica.Musica;
import br.ufg.inf.musica.MusicaDAO;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class TagDAO{

    public Tag cadastrar(Tag tag) throws Exception {

        String sql = null;

        try {

            String aux;

            sql = "INSERT INTO TAG (NOME) VALUES (?);";

            PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
            comandoSql.setString(1, tag.getNome());


            comandoSql.executeUpdate();
            //comandoSql.ge

            tag = this.obter(tag.getNome());

            //Retorna tag com seu id;

            return tag;

        } catch (Exception ex) {
            System.out.println("    TagDAO.cadastrar: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }


    }

    public Tag obter(String nome_tag) throws Exception {
        String sql = "SELECT * FROM TAG WHERE NOME = ?;";

        PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
        comandoSql.setString(1, nome_tag);
        return obter(comandoSql);
    }

    public Tag obter(int id_tag) throws Exception {
        String sql = "SELECT * FROM TAG WHERE ID_TAG = ?;";

        PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
        comandoSql.setInt(1, id_tag);
        return obter(comandoSql);
    }

    public Tag obter(PreparedStatement comandoSql) throws Exception {

        try {

            ResultSet rs = comandoSql.executeQuery();
            Tag tag = null;

            if (rs.next()) {
                tag = new Tag();
                tag.setId(rs.getInt("ID_TAG"));
                tag.setNome(rs.getString("NOME"));
                MusicaDAO musicaDAO = new MusicaDAO();
                //Busca músicas da tag
                tag.setMusicas(musicaDAO.listarMusicasPorTag(tag.getId()));
            }
            
            


            return (tag);
        } catch (Exception ex) {
            System.out.println("    TagDAO.obter: Erro ao executar SQL");
            Conexao.close();
            throw ex;
        }
    }

    public ArrayList<Tag> listar() throws Exception {
        String sql = null;
        try {

            sql = "SELECT * FROM TAG;";

            PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);



            ResultSet rs = comandoSql.executeQuery();
            ArrayList<Tag> lista = new ArrayList<Tag>();
            Tag tag = null;

            MusicaDAO musicaDAO = new MusicaDAO();
            while (rs.next()) {
                tag = new Tag();
                tag.setId(rs.getInt("ID_TAG"));
                tag.setNome(rs.getString("NOME"));               
                //Busca músicas da tag
                tag.setMusicas(musicaDAO.listarMusicasPorTag(tag.getId()));
                lista.add(tag);
            }

            return lista;
        } catch (Exception ex) {
            System.out.println("    TagDAO.listar: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }
    }

    public ArrayList<Tag> listarTagsDaMusica(int id_musica) throws Exception {

        String sql = null;
        try {

          sql = "SELECT "
                    + " tag.*"
                 + " FROM "
                    + " tag, musica_x_tag mxt"
                 + " WHERE "
                    + " tag.id_tag = mxt.id_tag"
                + " and mxt.id_musica = ?;";

            PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
            comandoSql.setInt(1, id_musica);


            ResultSet rs = comandoSql.executeQuery();
            ArrayList<Tag> lista = new ArrayList<Tag>();
            Tag tag = null;


            while (rs.next()) {

                tag = new Tag();
                tag.setId(rs.getInt("ID_TAG"));
                tag.setNome(rs.getString("NOME"));

                lista.add(tag);
            }


            return lista;
        } catch (Exception ex) {
            System.out.println("    TagDAO.listarTagsDaMusica: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }
    }

    public void like(int id_tag, int id_musica) throws Exception {

        String sql = null;

        try {


            sql = "UPDATE MUSICA_X_TAG SET LIKES = LIKES + 1 "
                    + " WHERE ID_MUSICA = ? AND ID_TAG = ? ;";

            PreparedStatement comandoSql1 = Conexao.getConnection().prepareStatement(sql);
            comandoSql1.setInt(1, id_musica);
            comandoSql1.setInt(2, id_tag);


            comandoSql1.executeUpdate();


        } catch (Exception ex) {
            System.out.println("    TagDAO.like: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }
    }

    public void dislike(int id_tag, int id_musica) throws Exception {
        String sql = null;

        try {

            sql = "UPDATE MUSICA_X_TAG SET DISLIKES = DISLIKES + 1 "
                    + " WHERE ID_MUSICA = ? AND ID_TAG = ? ;";

            PreparedStatement comandoSql1 = Conexao.getConnection().prepareStatement(sql);
            comandoSql1.setInt(1, id_musica);
            comandoSql1.setInt(2, id_tag);


            comandoSql1.executeUpdate();


        } catch (Exception ex) {
            System.out.println("    TagDAO.dislike: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }

    }

    public void relacionarTagAMusica(Tag tag, Musica musica) throws Exception {

        String sql = null;

        try {
            //System.out.println("    ClienteDAO.insert: Inicio...");
           
            sql = "INSERT INTO MUSICA_X_TAG (ID_MUSICA, ID_TAG, LIKES, DISLIKES) VALUES (?, ?, 0, 0);";

            PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
            comandoSql.setInt(1, musica.getId());
            comandoSql.setInt(2, tag.getId());

            comandoSql.executeUpdate();



        } catch (Exception ex) {
            System.out.println("    TagDAO.relacionarTagAMusica: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }


    }

    public void delete(Tag tag) throws Exception {
        String sql = null;

        try {

            sql = "DELETE FROM TAG WHERE ID_TAG = ?;";

            PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
            comandoSql.setInt(1, tag.getId());


            comandoSql.executeUpdate();

        } catch (Exception ex) {
            System.out.println("    TagDAO.delete: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }
    }
}
